﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Systemet.Domain
{
    class ProdukController
    {
        private Views.Produktkort prodkortMain;
        private Technical.ProduktConnection prdReg;
        private const int MINIMUM_LETTERS_ALLOWED = 2;
        private Produktregister produkt;
        private ProduktGrupp produktGrupp;
        private Produktkategori produktKategori;
        private IEnumerable<Produktgrupp> produktGrupper;
        private IEnumerable<Produktkategori> produktKategorier;
        private IEnumerable<Produktregister> produkter;
        private SideViews.SideProduktkort sideProdKort;

        //Intäktsbudgeteringsvariabler
        private Views.BudgeteringPerProdukt budgPProductMain;


        public ProdukController()
        {
            prdReg = new Technical.ProduktConnection();
        }

        public IEnumerable<Produktregister> ComboboxUpdate()
        {
            prodkortMain = (Views.Produktkort)AccessController.Instance.MainView;
            prdReg = new Technical.ProduktConnection();
            produkter = prdReg.getFiltreringskriterier();
            prodkortMain.UpdateProduktGrupper(prdReg.GetQueryGroupIDProd());
            prodkortMain.UpdateProduktKategorier(prdReg.GetQueryKatIDProd());
            return produkter;
        }
        public void UpdateSideProdukter()
        {
            sideProdKort = (SideViews.SideProduktkort)AccessController.Instance.SidMeny;
            sideProdKort.updateComboboxes();
        }
        public IEnumerable<Produktregister> Produktlista
        {
            get { return produkter = prdReg.getFiltreringskriterier(); }
            set { produkter = prdReg.getFiltreringskriterier(); }
        }

        public List<Produkt> updateProduktDGV(string prodOmrade, string prodKateg, string prodGrupp, string prodNamn, string prodId)
        {
            prdReg = new Technical.ProduktConnection();
            prodkortMain = (Views.Produktkort)AccessController.Instance.MainView;
            List<Produkt> produkter = prdReg.GetProdukt(prodOmrade, prodKateg, prodGrupp, prodNamn, prodId);
            return produkter;
        }

        public bool ValidateProdukt(Dictionary<string, string> ProdValidering, bool Isnew)
        {
            bool successfull = false;
            produkt = ProduktCreation(ProdValidering);
            prdReg = new Technical.ProduktConnection();

            if (prdReg.validateProdukt(produkt, Isnew))
            {
                ComboboxUpdate();
                successfull = true;
            }
            else
            {
                //GE felmeddelande till användare, returnera text med info
                successfull = false;
            }
            return successfull;
        }

        private Produktregister ProduktCreation(Dictionary<string, string> produktInfo)
        {
            produkt = new Produktregister();
            //produkt.Produktgrupp = new Produktgrupp();

            produkt.produktID = generateProdID(produktInfo["prodnamn"], produktInfo["prodgrupp"]);
            produkt.produkt = produktInfo["prodnamn"];
            produkt.produktGruppID = produkt.produktID.Substring(4, 2);

            foreach (Produktkategori pk in prdReg.GetProduktkateogori())
            {
                if (produktInfo["prodkategori"] == pk.produktKategoriNamn)
                    produkt.produktKategoriID = pk.produktKategoriID;
            }

            produkt.avdelningsnamn = produktInfo["prodomrade"];
            produkt.andratDatum = DateTime.Parse(produktInfo["andrad"]);
            produkt.signatur = produktInfo["signerad"];

            return produkt;
        }

        public void CreateProductFromfile(string prodID, string ProdNamn)
        {
            Produkt newProduct = new Produkt();
            prdReg = new Technical.ProduktConnection();
            newProduct.ProduktGrupp = "";
            produkter = Produktlista;
            newProduct.ProduktID = prodID;
            newProduct.ProduktNamn = ProdNamn;
            newProduct.ProduktGruppID = prodID.Substring(4, 2);

            foreach (Produktregister p in produkter)
            {
                if (p.produktGruppID.TrimEnd() == newProduct.ProduktGruppID)
                {
                    newProduct.ProduktGrupp = p.Produktgrupp.produktGruppNamn;
                    newProduct.Produktionsomrade = p.avdelningsnamn;
                    newProduct.ProduktKategori = p.Produktkategori.produktKategoriNamn;
                    newProduct.Signerad = AccessController.Instance.LoggedInUser.UserName;
                    newProduct.Datum = DateTime.Now;
                    break;
                }

            }
            if (newProduct.ProduktGrupp.Length < 4)
            {
                Random rnd = new Random();
                while (newProduct.ProduktGrupp.Length < 4)
                {
                    int antalbokst = rnd.Next(0, 26);
                    char bokstav = (char)('a' + antalbokst);
                    newProduct.ProduktGrupp = (newProduct.ProduktNamn.Substring(0, 3) + bokstav).ToUpper();
                }
                newProduktGruppID(newProduct.ProduktGrupp);
                //IEnumerable<Produktgrupp> prodgrupps = new List<Produktgrupp>();
                //prodgrupps = prdReg.GetQueryGroupIDProd();
                foreach (Produktgrupp pG in prdReg.GetQueryGroupIDProd())
                {
                    if (newProduct.ProduktGrupp == pG.produktGruppNamn)
                    {
                        newProduct.ProduktGruppID = pG.produktGruppID;
                    }

                }
                newProduct.Produktionsomrade = "Drift";
                newProduct.ProduktKategori = "Kundgemensamma";
                newProduct.Signerad = AccessController.Instance.LoggedInUser.UserName;
                newProduct.Datum = DateTime.Now;
            }
            prdReg.ProduktregistreringFromFile(newProduct);

        }

        private string generateProdID(string prdNamn, string prdGrupp)
        {
            List<Produktgrupp> prodGroups = new List<Produktgrupp>();
            prodGroups = prdReg.RetrieveProductGroups();
            produkter = prdReg.getFiltreringskriterier();
            string prodgruppID = "";

            foreach (Produktgrupp pG in prodGroups)
            {
                if (pG.produktGruppNamn.TrimEnd() == prdGrupp)
                {
                    prodgruppID = pG.produktGruppID.ToUpper();
                    break;
                }
            }

            Random rnd = new Random();
            bool basicCheck = false;
            //För testing Anser att vi bör göra ProduktgruppsID till 2 bokstäver, som hämtas istället.
            string prodID = "";
            if (prdNamn.Length > 3)
            {
                prodID = (prdNamn[0].ToString() + prdNamn[1].ToString() + prdNamn[2].ToString() + prdNamn[3].ToString()).ToUpper();
            }
            else
            {
                if (prdNamn.Length < 4)
                {
                    int antalbokst = rnd.Next(0, 26);
                    char bokstav = (char)('a' + antalbokst);

                    prodID = (prdNamn.Substring(0, 3) + bokstav).ToUpper();
                }
            }
            prodID += prodgruppID;

            if (!produkter.Any(item => item.produktID.TrimEnd().ToUpper() == prodID.TrimEnd()))
            {
                return prodID;
            }
            else
            {

                int i = 0;
                while (!basicCheck && i < 26)
                {
                    basicCheck = true;
                    char bokstav = (char)('a' + i);
                    prodID = prodID.Substring(0, 3);
                    prodID = (prodID + bokstav).ToUpper();
                    prodID += prodgruppID.ToUpper();
                    foreach (Produktregister p in produkter)
                    {
                        if (p.produktID.TrimEnd().ToUpper() == prodID.TrimEnd())
                        {
                            basicCheck = false;
                        }
                    }
                    i++;
                }
            }
            prodID = prodID.ToUpper();
            return prodID;
        }

        public bool checkLenghtTextbox(string stringToCheck)
        {
            if (stringToCheck.Length >= MINIMUM_LETTERS_ALLOWED)
                return true;
            else
                return false;
        }

        public bool newProduktGruppID(string newProdGrupp)
        {
            bool successfull = false;
            bool basicCheck = true;

            produktGrupper = prdReg.GetQueryGroupIDProd();

            string newProdGruppID = "";
            char[] splitKriterier = new char[] { '.', '-', ' ', '_' };
            string[] gruppID = newProdGrupp.Split(splitKriterier, StringSplitOptions.RemoveEmptyEntries);

            if (gruppID.Length > 1)
            {
                newProdGruppID += gruppID[0].Substring(0, 1);
                newProdGruppID += gruppID[1].Substring(0, 1);
            }
            else
            {
                newProdGruppID += gruppID[0].Substring(0, 2);
            }
            newProdGruppID = newProdGruppID.ToUpper();

            if (produktGrupper.Any(item => item.produktGruppID.TrimEnd() == newProdGruppID.TrimEnd()))
            {
                basicCheck = false;
            }
            int i = 0;
            while (!basicCheck && i < 26)
            {
                basicCheck = true;
                char bokstav = (char)('a' + i);
                newProdGruppID = newProdGruppID.Substring(0, 1);
                newProdGruppID = (newProdGruppID + bokstav).ToUpper(); ;
                foreach (Produktgrupp pK in produktGrupper)
                {
                    if (pK.produktGruppID.TrimEnd().ToUpper() == newProdGruppID.TrimEnd())
                    {
                        basicCheck = false;
                    }
                }
                i++;
            }
            if (basicCheck)
            {
                successfull = ProduktGruppCreation(newProdGrupp, newProdGruppID);
            }

            return successfull;
        }

        private bool ProduktGruppCreation(string newProdGruppNamn, string newProdGruppID)
        {
            bool successfull = false;

            if (!produktGrupper.Any(item => item.produktGruppNamn == newProdGruppNamn))
            {
                produktGrupp = new ProduktGrupp();
                produktGrupp.ProduktgruppID = newProdGruppID;
                produktGrupp.Produktgruppnamn = newProdGruppNamn;
                produktGrupp.Signatur = AccessController.Instance.LoggedInUser.UserName;
                produktGrupp.Datum = DateTime.Now;

                successfull = prdReg.NewProduktGrupp(produktGrupp);
                if (budgPProductMain != null)
                {
                    ComboboxUpdate();
                }
            }

            return successfull;
        }

        public bool ProduktKategoriSkapande(string newProdKategori)
        {
            bool successfull = false;
            produktKategorier = prdReg.GetProduktkateogori();
            if (!produktKategorier.Any(item => item.produktKategoriNamn == newProdKategori))
            {
                produktKategori = new Produktkategori();
                //produktKategori.produktKategoriID = newProdKategori; //autogenereras i DB
                produktKategori.produktKategoriNamn = newProdKategori;
                produktKategori.signatur = AccessController.Instance.LoggedInUser.UserName;
                produktKategori.andratDatum = DateTime.Now;

                successfull = prdReg.NewProduktKategori(produktKategori);
                ComboboxUpdate();
            }//ändra i comboboxupdate
            else
            {
                //fail
            }
            return successfull;
        }


        //Intäktsbudgetering per produkt
        public void UpdateBudgetPerProduktDGV(string prodID, string prodNamn, string gradA, string gradT)
        {
            prdReg = new Technical.ProduktConnection();
            budgPProductMain = (Views.BudgeteringPerProdukt)AccessController.Instance.MainView;
            List<Intäktsbudget> budgets = prdReg.RetrieveFilteredCustomers(prodID, prodNamn, gradA, gradT);
            //Uppdatera från MainView!
            budgPProductMain.UpdateDgv(budgets);
        }

        public bool validateProductExistance(string prodID, string prodNamn)
        {
            prdReg = new Technical.ProduktConnection();
            bool Exists = prdReg.ValidateIfProductExists(prodID, prodNamn);
            return Exists;
        }

        public IEnumerable<Produktregister> RetrieveAllBudgetedProducts()
        {
            prdReg = new Technical.ProduktConnection();
            IEnumerable<Produktregister> products = prdReg.RetrieveProductsOnBudget();
            return products;
        }
    }
}